﻿Imports FairShop.ImportDal
Imports FairShop.Objects
Imports System
Imports System.Data.OleDb
Imports System.Windows.Forms

Public Class ImporteerPrijzenForm

    Private _mainForm As Form
    Private _sw As Stopwatch

#Region "Public properties"

#End Region

#Region "Constructors"

    Public Sub New(ByVal mainForm As Form)
        Me.InitializeComponent()
        _mainForm = mainForm
        Me.ProgressBar1.Value = 0
        btnImporteren.Enabled = False
        Me.FillDatums()
    End Sub

#End Region

#Region "Event handling"

    Private Sub btnSluiten_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSluiten.Click
        Me.Close()
    End Sub

    Protected Overrides Sub OnKeyUp(ByVal e As KeyEventArgs)
        MyBase.OnKeyUp(e)
        Select Case e.KeyCode
            Case Keys.F12
                If (Not btnSluiten.Enabled) Then Return
                Me.Close()
            Case Keys.F2
                btnImporteren_Click(Me, EventArgs.Empty)
        End Select
    End Sub

    Private Sub btnBrowse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBrowse.Click
        Dim previouslocation As String = My.Settings.importlocatie
        previouslocation = previouslocation.Replace("<my documents>", My.Computer.FileSystem.SpecialDirectories.MyDocuments)
        Me.OpenFileDialog1.InitialDirectory = previouslocation
        If (Me.OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK) Then
            ' bewaar eerst de nieuwe settings
            Dim fi As New System.IO.FileInfo(Me.OpenFileDialog1.FileName)
            My.Settings.importlocatie = fi.DirectoryName
            My.Settings.Save()
            tbBestand.Text = Me.OpenFileDialog1.FileName
            btnImporteren.Enabled = True
        End If
    End Sub

    Private Sub btnImporteren_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnImporteren.Click
        Importeren()
    End Sub

    Protected Overrides Sub OnClosing(ByVal e As System.ComponentModel.CancelEventArgs)
        MyBase.OnClosing(e)
        If (Not btnSluiten.Enabled) Then e.Cancel = True
    End Sub

#End Region

#Region "Helperfuncties"

    Private Sub Importeren()
        Dim prf As New PerformantieHelper("Importeren nieuwe prijzen")
        InfoControl1.Clear()
        Me.btnImporteren.Enabled = False
        Me.btnSluiten.Enabled = False

        Backup.MaakBackup()

        Dim selectedValue As KeyValuePair(Of Date, String) = DirectCast(cbStartDatum.SelectedItem, KeyValuePair(Of Date, String))
        Dim startDatum As DateTime = selectedValue.Key

        ImporteerVanuitExcelBestand(tbBestand.Text, startDatum)

        Me.btnImporteren.Enabled = True
        Me.btnSluiten.Enabled = True
        prf.LogMeting()
    End Sub

    Private Sub ImporteerVanuitExcelBestand(ByVal bestandsnaam As String, ByVal startDatum As DateTime)
        _sw = New Stopwatch()
        _sw.Start()

        OnToonInfo(String.Format("Begin met inlezen van bestand {0}", bestandsnaam))

        Dim dal As New ImportDal()
        Try
            AddHandler dal.ToonInfo, AddressOf OnToonInfo
            AddHandler dal.ToonError, AddressOf OnToonError
            AddHandler dal.ToonProgress, AddressOf OnToonProgress

            Dim importDs As ImportDataSet = dal.GetImportDataset(bestandsnaam)
            If (importDs IsNot Nothing) Then
                ProgressBar1.Maximum = 1000
                ProgressBar1.Value = 0

                OnToonInfo("Klaar met inlezen vanuit Excel.")
                OnToonInfo("Begin met bijwerken van de databank.")

                Dim aantallen As ImportDal.Aantallen = dal.ImporteerVanuitExcelBestand(startDatum, importDs)
                OnToonInfo("De wijzigingen werden bewaard")
                OnToonInfo(String.Format("{0} artikel(s) werd(en) toegevoegd", aantallen.geimporteerdOmToeTeVoegen))
                If (startDatum < DateTime.Now()) Then
                    OnToonInfo(String.Format("{0} artikel(s) werd(en) klaargezet om bijgewerkt te worden in fase 2", aantallen.geimporteerdOmKlaarTeZetten))
                Else
                    OnToonInfo(String.Format("{0} artikel(s) werd(en) klaargezet om bijgewerkt te worden vanaf {1}", aantallen.geimporteerdOmKlaarTeZetten, startDatum.ToShortDateString()))
                End If
                If (aantallen.geimporteerdMetFout > 0) Then
                    OnToonError(String.Format("{0} artikel(s) met fouten", aantallen.geimporteerdMetFout))
                Else
                    OnToonInfo("Geen artikels met fouten")
                End If
                OnToonInfo(String.Format("{0} artikel(s) werd(en) niet gewijzigd", aantallen.geimporteerdEnOngewijzigd))
                If (startDatum < DateTime.Now()) Then
                    OnToonInfo(String.Format("{0} artikels werden bijgewerkt in fase 2.", aantallen.bijgewerktInFase2))
                End If
                If (aantallen.dubbeleBarcodesSamengevoegd > 0) Then
                    OnToonInfo(String.Format("{0} artikel(s) met dubbele barcodes werden samengevoegd.", aantallen.dubbeleBarcodesSamengevoegd))
                End If
            End If
            OnToonInfo("Einde. Duur: " & DateTime.MinValue.Add(_sw.Elapsed()).ToString("mm:ss"))
            ProgressBar1.Value = ProgressBar1.Maximum
            lblTijd.Text = "Klaar"
        Catch ex As Exception
            log.WriteError("ImporteerPrijzenForm.ImporteerVanuitExcelBestand" & Environment.NewLine & ex.ToString())
            OnToonError("Fout tijdens het importeren uit Excel")
            OnToonError(ex.Message)
            OnToonInfo("Einde. Duur: " & DateTime.MinValue.Add(_sw.Elapsed()).ToString("mm:ss"))
            ProgressBar1.Value = ProgressBar1.Maximum
            lblTijd.Text = "Er waren fouten"
        Finally
            RemoveHandler dal.ToonInfo, AddressOf OnToonInfo
            RemoveHandler dal.ToonError, AddressOf OnToonError
            RemoveHandler dal.ToonProgress, AddressOf OnToonProgress
            _sw = Nothing
        End Try
    End Sub

    ''' <summary>
    ''' Wordt dynamisch gekoppeld aan het VerhoogEnToonProgress-event van ImportDal
    ''' </summary>
    Private Sub OnToonProgress(ByVal args As ProgressParts)
        If (ProgressBar1.Maximum = 0) Then Return ' kan gebeuren als de importfile kleiner is dan 100 artikels
        ProgressBar1.Value = args.GetProgressValueOp1000()
        If (ProgressBar1.Value = 0) Then Return
        Dim overblijvendeTijd As TimeSpan = args.GetTimeRemaining()
        If (overblijvendeTijd.Ticks >= 0) Then
            lblTijd.Text = "Nog " & DateTime.MinValue.Add(overblijvendeTijd).ToString("mm:ss")
            Application.DoEvents()
        End If
    End Sub

    ''' <summary>
    ''' Wordt dynamisch gekoppeld aan het ToonInfo-event van ImportDal
    ''' </summary>
    ''' <param name="msg"></param>
    Private Sub OnToonInfo(ByVal msg As String)
        InfoControl1.ShowInfo(msg)
    End Sub

    ''' <summary>
    ''' Wordt dynamisch gekoppeld aan het ToonError-event van ImportDal
    ''' </summary>
    ''' <param name="msg"></param>
    Private Sub OnToonError(ByVal msg As String)
        InfoControl1.ShowError(msg)
    End Sub

    Private Sub FillDatums()
        Dim datum0 As New DateTime(Today.Year, Today.Month, 1)
        For i As Integer = 0 To 5
            Dim datum As DateTime = datum0.AddMonths(i)
            Dim displayvalue As String = datum.ToString("MMM yyyy")
            Dim item As New KeyValuePair(Of Date, String)(datum, displayvalue)
            cbStartDatum.Items.Add(item)
        Next
        cbStartDatum.DisplayMember = "Value"
        cbStartDatum.SelectedIndex = 1 ' selecteer item met eerste dag van volgende maand
    End Sub

#End Region

End Class